<!DOCTYPE html>
<html>
<head>
  <meta charset="UTF-8">
  <title>Document</title>
  <style>
    
  </style>
</head>
<body>
  
</body>
<script>

  // fn(5) = 5 * fn(4)
  // fn(4) = 4 * fn(3)
  // fn(3) = 3 * fn(2)
  // fn(2) = 2 * fn(1)
  // fn(1) = 1

  // =====

  // 复杂数据的深拷贝
  // 区分：对象，数组，函数
  // const obj = {}
  // const arr = []
  // const fn = function(){}
  // console.log( {}.toString.call(obj) );
  // console.log( {}.toString.call(arr) );
  // console.log( {}.toString.call(fn) );

  // 深拷贝：对象，数组，函数
  // for-in遍历拷贝对象
  // slice截取拷贝数组
  // bind拷贝函数


  // function deepClone(){}

  // 需求：能拷贝对象内的对象，数组，函数（多层深拷贝）

  // const obj = {
  //   name:"Admin",
  //   age:28,
  //   sayHello:function(){
  //     console.log("hello " + this.name);
  //   },
  //   child:[{
  //     name:"小admin1",
  //     age:8,
  //     sayHello:function(){
  //       console.log("hello " + this.name);
  //     }
  //   },{
  //     name:"小admin2",
  //     age:6,
  //     sayHello:function(){
  //       console.log("hello " + this.name);
  //     }
  //   }]
  // }

  // const obj2 = {};

  // // 只能深拷贝一层
  // for(let i in obj){
  //   obj2[i] = obj[i];
  // }

  // // 未实现深层的深拷贝
  // // obj2.child[0].name = "小root1"
  // // obj2.child.push({});
  // // 只实现了一层的深拷贝
  // obj2.name = "root";

  // console.log(obj)
  // console.log(obj2)



  // ==========


  function deepClone( target ){

    // let result;
    // if({}.toString.call(target) === "[object Object]"){
    //   result = {};
    // }
    // if({}.toString.call(target) === "[object Array]"){
    //   result = [];
    // }

    let result = {}.toString.call(target) === "[object Object]" ? {} : [];

    for(let i in target){
      if({}.toString.call(target[i]) === "[object Function]"){
        result[i] = target[i].bind( result );
      }else if(typeof target[i] === "object"){
        result[i] = deepClone(target[i])
      }else{
        result[i] = target[i];
      }
    }

    return result;
  }

  // 需求：能拷贝对象内的对象，数组，函数（多层深拷贝）

  const obj = {
    name:"Admin",
    age:28,
    sayHello:function(){
      console.log("hello " + this.name);
    },
    child:[{
      name:"小admin1",
      age:8,
      sayHello:function(){
        console.log("hello " + this.name);
      }
    },{
      name:"小admin2",
      age:6,
      sayHello:function(){
        console.log("hello " + this.name);
      }
    }]
  }



  const obj2 = deepClone(obj);

  obj.sayHello()
  obj2.sayHello()
  obj.child[0].sayHello()
  obj2.child[0].sayHello()
  obj.child[1].sayHello()
  obj2.child[1].sayHello()


  obj2.child[1].name = "小root2"

  console.log( obj );
  console.log( obj2 );

  console.log( obj === obj2 );
  console.log( obj.child === obj2.child );
  console.log( obj.child[0] === obj2.child[0] );
  console.log( obj.child[0].sayHello === obj2.child[0].sayHello );


  
</script>
</html>